package logger

import (
	"context"
	"fmt"
	"github.com/opentracing/opentracing-go"
	"github.com/uber/jaeger-client-go"
	"go.uber.org/zap"
)

func DebugTrace(ctx context.Context, args ...interface{}) {
	trace(ctx).Debug(args...)
}

func DebugfTrace(ctx context.Context, template string, args ...interface{}) {
	trace(ctx).Debugf(template, args...)
}

func InfoTrace(ctx context.Context, args ...interface{}) {
	trace(ctx).Info(args...)
}

func InfofTrace(ctx context.Context, template string, args ...interface{}) {
	trace(ctx).Infof(template, args...)
}

func WarnTrace(ctx context.Context, args ...interface{}) {
	trace(ctx).Warn(args...)
}

func WarnfTrace(ctx context.Context, template string, args ...interface{}) {
	trace(ctx).Warnf(template, args...)
}

func ErrorTrace(ctx context.Context, args ...interface{}) {
	trace(ctx).Error(args...)
}

func ErrorfTrace(ctx context.Context, template string, args ...interface{}) {
	trace(ctx).Errorf(template, args...)
}

func DPanicTrace(ctx context.Context, args ...interface{}) {
	trace(ctx).DPanic(args...)
}

func DPanicfTrace(ctx context.Context, template string, args ...interface{}) {
	trace(ctx).DPanicf(template, args...)
}

func PanicTrace(ctx context.Context, args ...interface{}) {
	trace(ctx).Panic(args...)
}

func PanicfTrace(ctx context.Context, template string, args ...interface{}) {
	trace(ctx).Panicf(template, args...)
}

func FatalTrace(ctx context.Context, args ...interface{}) {
	trace(ctx).Fatal(args...)
}

func FatalfTrace(ctx context.Context, template string, args ...interface{}) {
	trace(ctx).Fatalf(template, args...)
}

// logger带上TraceId
func trace(ctx context.Context) *zap.SugaredLogger {
	var jTraceId jaeger.TraceID
	if parent := opentracing.SpanFromContext(ctx); parent != nil {
		parentCtx := parent.Context()
		if tracer := opentracing.GlobalTracer(); tracer != nil {
			mySpan := tracer.StartSpan("my info", opentracing.ChildOf(parentCtx))
			if sc, ok := mySpan.Context().(jaeger.SpanContext); ok {
				jTraceId = sc.TraceID()
			}
			defer mySpan.Finish()
		}
	}

	return logger.With(zap.String(jaeger.TraceContextHeaderName, fmt.Sprint(jTraceId)))
}
